package com.zx.system.block.mapstruct;

import com.zx.core.context.TenantContextHolder;
import com.zx.core.enums.StatusEnum;
import com.zx.system.block.model.SysRole;
import com.zx.system.block.param.RoleParam;
import com.zx.system.block.vo.SysRoleVO;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.ReportingPolicy;
import org.mapstruct.factory.Mappers;

/**
 * <p>
 * description: 角色参数映射 <br>
 * create: 2024-10-29 15:10
 * </p>
 *
 * @author zhou  xun
 */
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface RoleMapStructMapper {
    RoleMapStructMapper INSTANCE = Mappers.getMapper(RoleMapStructMapper.class);

    /**
     * 将RoleParam转换为SysRole实体
     *
     * @param roleParam 角色参数
     * @return SysRole实体
     */
    SysRole roleParamToSysRole(RoleParam roleParam);

    /**
     * 将SysRole实体转换为SysRoleVO视图对象
     *
     * @param sysRole 角色实体
     * @return SysRoleVO视图对象
     */
    SysRoleVO sysRoleToSysRoleVO(SysRole sysRole);

    /**
     * 在映射完成后，设置描述性字段
     *
     * @param sysRole   角色实体
     * @param sysRoleVO 角色VO
     */
    @AfterMapping
    default void setDescriptions(SysRole sysRole, @MappingTarget SysRoleVO sysRoleVO) {
        // 设置状态描述
        Integer status = sysRole.getStatus();
        StatusEnum statusEnum = StatusEnum.getEnumByCode(status);
        if (statusEnum != null) {
            sysRoleVO.setStatusDesc(statusEnum.getDesc());
        }
    }

    /**
     * 在映射完成后，设置租户名
     *
     * @param sysRole   角色实体
     * @param sysRoleVO 角色VO
     */
    @AfterMapping
    default void setTenantName(SysRole sysRole, @MappingTarget SysRoleVO sysRoleVO) {
        sysRoleVO.setTenantName(TenantContextHolder.getTenantName());
    }
}